﻿using System;
using System.Collections.Generic;
using System.Threading;
using System.Linq;
using System.Text;
using Microsoft.ServiceHosting.ServiceRuntime;
using ZeCloud.Resto55.Business;
using ZeCloud.Resto55.Business.Table;
using System.Net;
using Microsoft.Samples.ServiceHosting.StorageClient;

namespace Resto55Business_WorkerRole_Tests
{
    public class WorkerRole : RoleEntryPoint
    {
        public override void Start()
        {

            RoleManager.WriteToLog("Information", "Worker Process entry point called : starting...");

            bool runDemo = false;
            if (runDemo)
            {
                // [PENDING] Création du schéma 
                // Ou vérification que le schéma existe

                // Steve : Attente pour faciliter le debugging
                Thread.Sleep(5 * 1000);

                RunBusinessLogic();
            }

            bool clearDB = false;
            if (clearDB)
            {
                // [PENDING] Création du schéma 
                // Ou vérification que le schéma existe

                // Steve : Attente pour faciliter le debugging
                Thread.Sleep(5 * 1000);

                ClearAzureStorage();
            }

            Thread.Sleep(60 * 1000);

            RoleManager.WriteToLog("Information", "Worker Process entry point called : completed");

        }

        //public void CacheRefresherThread()
        //{
        //    WebClient client = new WebClient();
        //    while (true)
        //    {
        //        Message workItem = RefreshQueue.GetWorkItem();
        //        if (workItem != null)
        //        {
        //            Uri serviceUri = new Uri(workItem.ContentAsString());
        //            string result = client.DownloadString(string.Format("http://{0}:{1}/CacheRefresherService.svc/refresh", serviceUri.Host, serviceUri.Port));
        //            RoleManager.WriteToLog("Information", "Refresh Cache :" + result);
        //        }

        //        Thread.Sleep(1 * 1000);
        //    }
        //}

        public override RoleStatus GetHealthStatus()
        {
            // This is a sample worker implementation. Replace with your logic.
            return RoleStatus.Healthy;
        }


        public void RunBusinessLogic()
        {
            var resto = BusinessFacade.CreerFacade().GetRestoService().CreerRestoPar(RestoService.ANONYMOUS, "Resto55", 99, "ZeCloud");
            if (resto == null)
            {
                RoleManager.WriteToLog("Warning", "Resto could not be created");
            }
            RoleManager.WriteToLog("Information", "Resto created");

            // Recherche des restaurants
            var restos = BusinessFacade.CreerFacade().GetRestoService().RechercherRestosParVille("ZeCloud");
            Resto dernierResto = null;
            foreach (var i in restos.AsEnumerable<Resto>())
            {
                dernierResto = i;
                RoleManager.WriteToLog("Information", "Resto in " + i.ville);
            }

            // Recherche des villes 
            var villes = BusinessFacade.CreerFacade().GetRestoService().RechercherVillesDemarrantPar("ZeC");
            
            foreach (var i in villes.AsEnumerable<String>())
            {
               
                RoleManager.WriteToLog("Information", "Ville commencant par ZeC " + i);
            }

            // Créer un plat dans un restaurant
            if (dernierResto != null)
            {
                var element = BusinessFacade.CreerFacade().GetRestoService().CreerElement(dernierResto.uniqueId, "Coca", "Boisson", "Du coca-cola zéro");
                if (element != null)
                {
                    RoleManager.WriteToLog("Information", "Création d'un élément " + element.Description);
                }
                else
                {
                    RoleManager.WriteToLog("Warning", "L'élément existe déjà ");
                }


                // Récupérer la liste des éléments dans un restaurant
                var elements = BusinessFacade.CreerFacade().GetRestoService().RechercherElementsPourResto(dernierResto.uniqueId);
                Element dernierElement = null;
                foreach (var i in elements.AsEnumerable<Element>())
                {
                    dernierElement = i;
                    RoleManager.WriteToLog("Information", "Element " + i.Title + ", " + i.Description);
                }

                // Ajouter un prix sur un élément d'un restaurant
                if (dernierElement != null)
                {
                    var nouveauPrix = BusinessFacade.CreerFacade().GetRestoService().AjouterPrix(dernierElement.GetElementID(), 3.5);
                    RoleManager.WriteToLog("Information", "Création d'un prix à la date " + nouveauPrix.dateSaisie + ", " + nouveauPrix.idAuteur);
                }

                // Récupérer la liste des prix 
                var prix = BusinessFacade.CreerFacade().GetRestoService().RechercherPrixPourElement(dernierElement.GetElementID());
                DetailPrix dernierPrix = null;
                foreach (var i in prix.AsEnumerable<DetailPrix>())
                {
                    dernierPrix = i;
                    RoleManager.WriteToLog("Information", "DetailPrix " + i.prix + ", saisi le " + i.dateSaisie + ", par " + i.idAuteur);
                }
            }

            RoleManager.WriteToLog("Information", "Test done");


        }


        public void ClearAzureStorage()
        {
            // Supprimer les restaurants de la ville
            var restos = BusinessFacade.CreerFacade().GetRestoService().RechercherRestosParVille("ZeCloud");
            foreach (var r in restos.AsEnumerable<Resto>())
            {
                BusinessFacade.CreerFacade().GetRestoService().SupprimerResto(r);
            }

            // Supprimer les restaurants de la ville
            var restos2 = BusinessFacade.CreerFacade().GetRestoService().RechercherRestosParVille("ZeCloud2");
            foreach (var r in restos2.AsEnumerable<Resto>())
            {
                BusinessFacade.CreerFacade().GetRestoService().SupprimerResto(r);
            }
 

            RoleManager.WriteToLog("Information", "Test done");


        }
    }
}
